# This is the main file of the RollCall_Next project.

# 字体说明
# lighter 为细体，normal 为正常粗细，bold 为粗体，bolder 为特粗体

import PySimpleGUI as sg
import random
import configparser
import os

from cead import encrypt, decrypt

class Main:
    def __init__(self):
        #检查目录下是否有name_list.ini文件，如果没有则创建，并搭建基本框架，完成后以gbk格式保存文件
        if not os.path.exists("name_list.ini"):
            with open("name_list.ini", "w", encoding="gbk") as f:
                f.write("[namelist]\nname1=[]")
                f.close()
        
        self.name_list = configparser.ConfigParser() #创建名单配置文件对象
        self.name_list.read("name_list.ini", encoding="gbk") #读取名单配置文件
        
        cnt = 1 #计数器
        while True: #循环读取名单配置文件，直到找到有效的名单
            try:
                self.names = eval(self.name_list["namelist"][f"name{cnt}"]) #尝试读取名单
                print(cnt)
            except KeyError:
                print('error',cnt)
                cnt -= 1 #如果读取失败则减少计数器
                break #如果没有找到有效的名单则退出循环
            else:
                cnt += 1
        
        self.name_list_num = cnt
        del cnt #删除计数器

        print('名单数量：', self.name_list_num) #打印名单数量

        self.decrease = True #是否减少名单
       
        #控件
        self.rollcall_name = sg.Text("等待开始", font=("黑体", 60, "bold"))
        self.rollcall_button = sg.Button("开始点名", font=("黑体", 25, "bold"), key="rc")
        self.reset_button = sg.Button("重置名单", font=("黑体", 20, "normal"), key="reset")

        #布局
        self.layout = [
            [self.rollcall_name],
            [self.rollcall_button, self.reset_button]
        ]

    #函数区
    def rollcall(self): #随机点名函数
        try:
            random.shuffle(self.names) #随机打乱名字顺序
            tmp_out = random.choice(self.names) #随机选择一个名字作为临时出席者
        except IndexError:
            sg.popup("名单已空！", title="提示", font=("黑体", 20, "bold")) #弹出提示框
            return "名单已空！" #返回提示信息
        if self.decrease: #如果减少名单
            self.names.remove(tmp_out) #从名单中删除临时出席者
        return tmp_out #返回点名结果

    def main(self):
        self.window = sg.Window("RollCall Next", self.layout, size=(500, 300)) #创建窗口 layout为布局，size为窗口大小

        while True: #循环读取窗口事件
            self.event, self.values = self.window.read() #读取窗口事件和值
            if self.event == sg.WIN_CLOSED: break #如果关闭窗口则退出循环
            if self.event == "rc": #如果点击了Roll Call按钮
                self.name = self.rollcall() #调用rollcall函数获取点名结果
                self.rollcall_name.update(self.name) #更新rollcall_name控件的文本
                print(self.name) #打印点名结果
                del self.name #删除变量name

        self.window.close() #关闭窗口

if __name__ == "__main__":
    main = Main()
    main.main()
